/*
 * @Author: _LJP 2634716776@qq.com
 * @Date: 2023-12-22 17:46:16
 * @LastEditors: _LJP 2634716776@qq.com
 * @LastEditTime: 2023-12-23 10:32:56
 * @FilePath: /my_-linux/Pro23/Set/SetTest/test.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include<iostream>

#include<set>

using namespace std;

/*
    关联式容器
    底层的实现为平衡搜索二叉树
    其功能主要实现为两点分别为: 去重+排序
*/

void key_test1(){
    set<int> s1;
    s1.insert(1);
    s1.insert(2);
    s1.insert(1);
    s1.insert(3);
    s1.insert(4);
    s1.insert(6);
    s1.insert(5);

    for(auto it:s1){
        cout<<it<<" ";
    }
    //数据插入时key值不允许冗余
    cout<<endl;

    set<int>::iterator it = s1.begin();
    while(it!=s1.end()){
        //*it+=1;  -error
        /*
            set中的key值不允许被修改
            否则将会破坏平衡搜索二叉树的结构
            其普通迭代器为const迭代器,const迭代器也为const迭代器,为保证节点key值不被修改
            其迭代器为双向迭代器
        */
        cout<<*it<<" ";
        ++it;
    }
    cout <<  endl;

    //删除其中一个节点，节点位置通过set<type>::find()函数返回,类型为迭代器
    s1.erase(s1.find(5));
    for (auto it : s1)
    {
        cout << it << " ";
    }
    cout << endl;

    /*
        set中的count能确定该元素(key值)是否存在于该树中
    */
    cout << "s1.count(5) == " << s1.count(5) << endl;
    cout << "s1.count(3) == " << s1.count(3) << endl;


    //-------------------------------
    //判断一个元素是否存在于该树中
    int in = 0;
    while(cin>>in){
        if(s1.count(in)) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }

    //-------------------------------


}

void multiset_test1(){
    /*
        同为关联式容器,
        其功能于set类似,不同的是multiset容器允许键值(key)冗余
        其功能主要实现即为 排序;
    */
   multiset<int> ms1;
   ms1.insert(1);
   ms1.insert(2);
   ms1.insert(1);
   ms1.insert(3);
   ms1.insert(4);
   ms1.insert(5);
   ms1.insert(3);

   multiset<int>::iterator it = ms1.begin();
   while(it!=ms1.end()){
    //验证允许键值冗余
        cout<<*it<<" ";
        ++it;
    //    *it+=1; -error 虽然允许键值冗余,但是仍保持搜索二叉树的特性不能对键值进行修改;
   }
   cout<<endl;

   for(auto mit:ms1){
    cout<<mit<<" ";
   }
   cout<<endl;

   //--------------------
    /*
        该处的count与set中的count不同
        set中的count只能判断该元素是否存在于该树当中
        而multiset中的count能反馈键值中的元素个数
    */
   cout << ms1.count(2) << endl;
   cout << ms1.count(1) << endl;
   cout << ms1.count(3) << endl;

   //--------------------
    /*
        multiset<type>::find();
        multiset中的find函数所找到的数据为中序遍历的第一个;
    */

    it = ms1.find(1);
    while(it!=ms1.end() && *it == 1){
        //中序的第一个,打印完之后将会打印中序后的下一个对应元素;
        cout << *it << " ";
        ++it;
    }
    cout<<endl;
}

int main()
{
    /*cout<<"hello world"<<endl;*/

    // key_test1();

    multiset_test1();
    
    return 0;
}